// 助手
function _helper(rgx, message, type) {
  return {
    type: type || 'string',
    validator: (rule, value, callback) => {
      if (value === '' || value === null || rgx.test(value)) {
        callback()
      } else {
        callback(new Error(message || '请重新输入'));
      }
    }
  }
}

// 必填项
function required(message) {
  return {
    message: message || '此项必填',
    required: true
  }
}
// 长度
function length(min, max, message, type) {
  if (message == undefined) {
    message = '请输入长度'
    let minmax = ''
    if (min) {
      minmax += '大于' + min + '个'
    }
    if (max) {
      if (minmax.length) {
        minmax += '且'
      }
      minmax += '小于' + max + '个'
    }
    if (minmax.length) {
      message += minmax + '的'
    }
    message += '字符'
  }
  return {
    message: message,
    min: min,
    max: max,
    type: type || 'string'
  }
}

// 小数数值
function float(min, max, message) {
  if (message == undefined) {
    message = '请输入'
    let minmax = ''
    if (min != undefined) {
      minmax += '大于' + min
    }
    if (max != undefined) {
      minmax += '小于' + max
    }
    if (minmax.length) {
      message += minmax + '的'
    }
    message += '小数数值'
  }
  return {
    message: message,
    min: min,
    max: max,
    type: 'float'
  }
}
// 整数数值
function integer(min, max, message) {
  if (message == undefined) {
    message = '请输入'
    let minmax = ''
    if (min != undefined) {
      minmax += '大于' + min
    }
    if (max != undefined) {
      minmax += '小于' + max
    }
    if (minmax.length) {
      message += minmax + '的'
    }
    message += '整数数值'
  }
  return {
    message: message,
    min: min,
    max: max,
    type: 'integer'
  }
}
// 数字
function number(min, max, message) {
  if (message == undefined) {
    message = '请输入'
    let minmax = ''
    if (min != undefined) {
      minmax += '大于' + min
    }
    if (max != undefined) {
      minmax += '小于' + max
    }
    if (minmax.length) {
      message += minmax + '的'
    }
    message += '数字'
  }
  return {
    message: message,
    min: min,
    max: max,
    type: 'number'
  }
}

// 数字大于0
function numberGreater(min, max) {
  // if (message == undefined) {
  //   message = '请输入'
  //   let minmax = ''
  //   if (min != undefined) {
  //     minmax += '大于' + min
  //   }
  //   if (max != undefined) {
  //     minmax += '小于' + max
  //   }
  //   if (minmax.length) {
  //     message += minmax + '的'
  //   }
  //   message += '数字'
  // }
  return {
    message: '请输入大于0的数字',
    min: min,
    max: max,
    type: 'number'
  }
}

// 邮箱
function email(message) {
  return {
    message: message || '请输入正确的邮箱地址',
    type: 'email'
  }
}
// 网址
function url(message) {
  return {
    message: message || '请输入正确的网址',
    type: 'url'
  }
}

// 编码格式
function code(message) {
  return _helper(
    /^[a-zA-Z0-9_-]+$/,
    message || '请输入英文字母或数字的内容'
  )
}

// 编码格式
function menu(message) {
  return _helper(
    /\/.*/,
    message || '请输入/开头字符'
  )
}

// 域名或IP
function domain(message) {
  return _helper(
    /^(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6})|((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9]))$/,
    message || '请输入正确的域名或IP'
  )
}
// 身份证号码
function idCode(message) {
  return _helper(
    /^([1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])$/,
    message || '请输入正确的身份证号码'
  )
}
// 电话号码（含手机号码）
function tel(message) {
  return _helper(
    /^(1[3-9][0-9][-]?[0-9]{4}[-]?[0-9]{4})|(0(([0-9]{2}[-]?[0-9]{4}[-]?[0-9]{4})|([0-9]{3}[-]?[0-9]{7}))|((400|800)[-]?([0-9]{3}[-]?[0-9]{4})))$/,
    message || '请输入正确的电话号码'
  )
}
// 微信
function wx(message) {
  return _helper(
    /^[a-zA-Z][a-zA-Z\d_-]{5,19}$/,
    message || '请输入正确的微信号码'
  )
}
// QQ
function qq(message) {
  return _helper(
    /^[1-9][0-9]{4,12}$/,
    message || '请输入正确的QQ号码'
  )
}

// 英文字母
function en(message) {
  return _helper(
    /^[a-zA-Z]+$/,
    message || '请输入英文字母'
  )
}
// 英文字母或数字
function enOrNum(message) {
  return _helper(
    /^[a-zA-Z0-9]+$/,
    message || '请输入英文字母或数字'
  )
}
// 中文字符
function cn(message) {
  return _helper(
    /^[\u4e00-\u9fa5]+$/,
    message || '请输入中文字符'
  )
}
// 中文字符和中文符号Punctuation【。；，：“”（）、？《》】
function cnAndPun(message) {
  return _helper(
    /^[\u4e00-\u9fa5\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]+$/,
    message || '请输入中文字符'
  )
}
// 中文字符或英文字母开头可含数字和中文符号【（）、】
function cnOrEnAndNum(message) {
  return _helper(
    /^[a-zA-Z\u4e00-\u9fa5][a-zA-Z0-9-\u4e00-\u9fa5_\uff08\uff09\u3001]*$/,
    message || '请输入中文字符开头可含英文字母或数字的内容'
  )
}
// 中文字符或英文字母开头可含数字和中文符号【（）、】
function cnEnNumPun(message) {
  return _helper(
    /^[a-zA-Z0-9-\u4e00-\u9fa5_ \uff08\uff09\u3001]+$/,
    message || '允许中文、英文、数字、空格、横线和下划线'
  )
}

export default {
  required,
  length,
  float,
  integer,
  number,
  numberGreater,
  url,
  code,
  domain,
  menu,
  idCode,
  tel,
  email,
  wx,
  qq,
  en,
  enOrNum,
  cn,
  cnAndPun,
  cnOrEnAndNum,
  cnEnNumPun
}
